#ifndef __MY__HTTP__
#define __MY__HTTP__
#include <iostream>
#include <pthread.h>
#include <signal.h>
#include "Task.hpp"
#include "ThreadPool.hpp"
#include "Log.hpp"
// #include "Protocol.hpp"
#include "TcpServer.hpp"

class HttpServer
{
#define PORT 8888
private: 
    int _port;
    // TcpServer *_tcp_server;
    bool _stop; // 是否停止
    // ThreadPool _thread_pool;  使用线程池了
public:
    HttpServer(int port = PORT) : _port(port), _stop(false)
    { 
    }

    void InitServer()  
    {
        //信号SIGPIPE需要进行忽略，如果不忽略，在写入的时候，可能会直接崩溃server（匿名管道一边关闭连接，另一端就挂掉了）
        signal(SIGPIPE, SIG_IGN);
        // _tcp_server = TcpServer::GetInstance(_port);
        
    }

    void Loop()
    {
        LOG(INFO, "loop begin....");
        TcpServer* tsvr = TcpServer::GetInstance(_port);
        // int listen_sock = _tcp_server->Sock();
        while (!_stop)
        {   
            // std::cout<<listen_sock<<std::endl;

            struct sockaddr_in peer;
            socklen_t len = sizeof(peer);
            int sock = accept(tsvr->Sock(), (struct sockaddr *)&peer, &len);
            // std::cout<<sock<<std::endl;
            if (sock < 0)
                continue;

            LOG(INFO, "Get a new link....");
            //单线程不好用，使用线程池版本
            // int *sock_ = new int(sock);
            // pthread_t tid;
            // pthread_create(&tid, nullptr, Entrance::HandlerRequest, sock_); // sock_是参数
            // pthread_detach(tid);
            // LOG(INFO, "cerate new thread success...");
            
            //线程池
            Task task(sock);
            // _thread_pool.PushTask(task);
            ThreadPool::GetInstance()->PushTask(task);

        }
        LOG(INFO, "loop end....");
    }

    ~HttpServer() {}
};

#endif